'use strict';

// 扩展 jquery from 表单序列化
$.fn.serializeJson = function () {
    var serializeObj = {};
    $(this.serializeArray()).each(function () {
        serializeObj[this.name] = this.value;
    });
    return serializeObj;
}

// 用于存储函数配置
var funcData = {};
var funcDataList = [];
var runFlag = false;
var editor = null;
var dataTabs = null;

$(function () {
    // 获取项目工程
    getProjectSelect();

    // 绑定 DataTables
    dataTabs = bindDataTables($('#data-list'));
    // 获取函数配置
    getFuncData(dataTabs);

    // 绑定代码编辑器
    editor = bindCodeMirror(document.getElementById('funcCode'));
    // 监听代码编辑器更改事件
    editor.on("change", function () {
        runFlag = false;
    });

    // 显示 函数配置 模态框
    $('#btnAdd').on('click', function () {
        $('#serviceFuncOper').modal('show');
    });
    $('#serviceFuncOper').on('shown.bs.modal', function () {
        editor.refresh();
    });

    // 关闭 函数配置 模态框
    $('button.btn-close').on('click', function () {
        $('#serviceFuncOper').modal('hide');
        // 重置表单
        $('#postForm')[0].reset();
        // 重置 guid
        $("#guid").val('');
        // 重置 editor
        editor.setValue('');
    });

    // 试运行函数配置
    $('#btnRun').on('click', function () {
        var newHTML = '';
        // 验证函数配置 与 试运行
        funcData = validFunc(editor);
        if (funcData) {
            if (funcData.args.length > 0) {
                newHTML += '<form class="form-horizontal" id="runTestForm" role="form">';
                funcData.args.forEach(function (item) {
                    newHTML += '<div class="form-group">';
                    newHTML += '    <label class="col-sm-3 control-label">' + item + '：</label>';
                    newHTML += '    <div class="col-sm-8">';
                    newHTML += '        <input type="text" name="' + item + '" class="form-control" />';
                    newHTML += '    </div>'
                    newHTML += '</div>';
                });
                newHTML += '</form>';
                $('#runContent').html(newHTML);
                $('#testRunFunc').modal('show');
                return;
            }
            $('#btnRunTest').click();
        }
    });

    // 运行函数
    $('#btnRunTest').on('click', function () {
        var jsFunc = funcData.funcScript + ' ' + funcData.funcName + '(';
        var formData = '';
        if (funcData.args.length > 0) {
            $('#runTestForm').serializeArray().forEach(function (item) {
                formData += isNaN(item.value) ? '"' + item.value + '",' : item.value + ','
            });
            formData = formData.replace(/,$/gi, '');
        }
        jsFunc += formData + ')';
        var result = runEval(jsFunc);
        if (result === 'error') {
            bootbox.alert('执行函数失败，请在编辑器中检查！');
        } else {
            var rep = result === undefined ? '' : '执行结果为：' + result;
            bootbox.alert('执行成功！' + rep);
            runFlag = true;
        }
    });

    // 保存表单
    $('#btnSave').on('click', function () {
        // 获取表单中的数据
        var fromData = $('#postForm').serializeJson();

        if (fromData['pcode'] === '') {
            bootbox.alert('请选择项目工程！');
            return;
        }

        if (fromData['functitle'] === '') {
            bootbox.alert('请输入功能名称！');
            return;
        }

        if (runFlag) {
            //fromData['functitle'] = funcData['functitle'];
            fromData['funcscript'] = funcData['funcScript'];
            fromData['funcname'] = funcData['funcName'];
            var postUrl = fromData['guid'] === '' ? '/system/sysfunc/insertSysFunction' : '/system/sysfunc/updateSysFunction';
            $.ajax({
                type: 'POST',
                url: postUrl,
                data: JSON.stringify(fromData),
                dataType: 'json',
                contentType: "application/json"
            }).done(function (res) {
                if (res.success) {
                    getFuncData(dataTabs);
                    $('button.btn-close').click();
                    bootbox.alert(res.msg);
                } else {
                    bootbox.alert(res.msg);
                }
            });
        } else {
            bootbox.alert('请先对函数配置运行测试！');
        }
    });

    // 查询 与刷新
    $('#btnRef,#btn_Search').on('click', function () {
        getFuncData(dataTabs);
    });

});

// 验证函数配置 与 试运行
function validFunc(editor) {
    var func = editor.getValue();

    // 验证函数
    var reg = /^function(\s[_A-Za-z]([_A-Za-z0-9]+)?)?(\s?\((\s?[_A-Za-z]([_A-Za-z0-9]+,?)?)*?\))(\s?\{)/;
    if (!reg.test(func) || !/}$/.test(func)) {
        bootbox.alert('函数格式不正确！');
        return null;
    }

    // 获取函数名称
    var funcName = func.match(/function(\s[_A-Za-z]([_A-Za-z0-9]+)?)/) || '';
    if (funcName === '') {
        bootbox.alert('函数配置不支持匿名函数！');
        return null;
    }
    // 获取函数中的参数
    var args = func.substring(func.indexOf('(') + 1, func.indexOf(')')) || [];
    if (args.length > 0) {
        args = args.replace(/,$/gi, '').split(',');
    }

    if (runEval() === 'error') {
        bootbox.alert('函数格式不正确！');
        return null;
    }

    return {
        funcName: $.trim(funcName[1]),
        funcScript: func,
        args: args
    }
}

// 获取项目工程
function getProjectSelect() {
    $('select[name="pcode"]').html("");
    $.ajax({
        type: 'POST',
        // url :  '/system/sysprjService/getProjectList',
        url: "/system/sysProject/getProjectToUser",
        dataType: 'json',
        success: function (result) {
            var str = "<option value=''>请选择</option>";
            if (result.success && result.data != null && result.data.length > 0) {
                for (var i = 0; i < result.data.length; i++) {
                    str += "<option value='" + (result.data[i].id || result.data[i].pcode) + "'>" + (result.data[i].name || result.data[i].pname) + "</option>";
                }
                $('select[name="pcode"]').append(str);
            }
        },
        error: function () {
            bootbox.alert("获项目工程失败,请刷新后重试!");
        }
    });
}

// 绑定 CodeMirror
function bindCodeMirror(el) {
    return CodeMirror.fromTextArea(el, {
        mode: "javascript",
        lineNumbers: true,
        height: '200px',
        theme: "neat",
        styleActiveLine: true,
        matchBrackets: true
    });
}

// 绑定 DataTables
function bindDataTables(el) {
    var oTable = el.dataTable({
        autoWidth: true,
        ordering: false,
        searching: false,
        paging: false,
        serverSize: false,
        lengthChange: false,
        // displayLength: 1,
        language: {
            zeroRecords: '查询不到任何相关数据',
            emptyTable: '暂无数据',
            processing: '正在加载数据...',
            info: '显示第 _START_ 到第 _END_ 条记录，总共 _TOTAL_ 条记录',
            infoEmpty: '当前显示0到0条，共0条记录',

            "oPaginate": {
                "sFirst": "首页",
                "sPrevious": "上一页",
                "sNext": "下一页",
                "sLast": "末页"
            }
        },
        columns: [
            {
                name: 'id',
                title: '',
                class: 'text-center',
                width: '20',
                render: function (settings, rowIdx, rec, type) {
                    return "<input type='checkbox' name='guid' value='" + rec.guid + "'/>";
                }
            },
            {
                data: 'pname',
                title: '项目名称',
                width: '15%',
                class: 'text-center'
            },
            {
                data: 'functitle',
                title: '功能名称',
                width: '15%',
                class: 'text-center'
            },
            {
                data: 'funcname',
                title: '函数名称',
                width: '15%',
                class: 'text-center'
            },
            {
                data: 'remark',
                title: '备注',
                class: 'text-center'
            },
            {
                name: '',
                title: '操作',
                class: 'text-center',
                width: '15%',
                render: function (settings, rowIdx, rec, type) {
                    return '<a href="javascript:;"  onclick="editFunc(' + type.row + ')" title="编辑" class="btn btn-default btn-sm"><i class="fa fa-edit"></i></a>&ensp;' +
                        '<a href="javascript:;" onclick="delFunc(' + type.row + ')" title="删除" class="btn btn-default btn-sm"><i class="fa fa-times"></i> </a>';
                }
            }
        ],
        createdRow: function (row, data, dataIndex) {
            $('td:eq(0)', row).html("<i class='fa fa-plus row-details' data-id='" + dataIndex + "'></i>&nbsp;");
        },
    });
    // 添加 Table 折叠事件
    oTable.on('click', ' tbody td .row-details', function () {
        var nTr = $(this).parents('tr')[0];
        var index = $(this).attr('data-id');
        var func = funcDataList[index];
        if (oTable.fnIsOpen(nTr)) {
            $(this).addClass("fa-plus").removeClass("fa-minus");
            oTable.fnClose(nTr);
        } else {
            $(this).addClass("fa-minus").removeClass("fa-plus");
            var sOut = '<textarea id="code-' + index + '">' + func.funcscript + '</textarea>';
            oTable.fnOpen(nTr, sOut);
            bindCodeMirror(document.getElementById('code-' + index)).setOption("readOnly", true);
        }
    });
    return oTable;
}

// 试运行函数配置
function runEval(jsFunc) {
    try {
        return eval(jsFunc);
    } catch (e) {
        return 'error';
    }
}

// 获取函数配置
function getFuncData($table) {
    var url = postPath + '/system/sysfunc/getSysFuncByPagination?pageNo=1&pageSize=10&' + $('#queryForm').serialize();
    $.getJSON(url).done(function (res) {
        if (res.success) {
            funcDataList = res.data.rows;
            $table.fnClearTable();
            $table.find(' thead th #all_checked').prop('checked', false);
            $table.fnAddData(funcDataList);
            return;
        }
        bootbox.alert("获取函数配置列表失败,请刷新后重试!");
    }).error(function (e) {
        bootbox.alert("获取函数配置列表失败,请刷新后重试!");
    });
}

// 编辑
function editFunc(index) {
    var data = funcDataList[index];
    $('#postPcode').val(data.pcode);
    $('input:hidden[name=guid]').val(data.guid);
    $('#funcTitle').val(data.functitle);
    editor.setValue(data.funcscript);
    $('textarea[name=remark]').val(data.remark);
    $('#serviceFuncOper').modal('show');
}

//删除
function delFunc(index) {
    var data = funcDataList[index];
    bootbox.confirm("确认删除?", function (result) {
        if (result) {
            $.getJSON('/system/sysfunc/deleteSysFunctionByGuids?guids=' + data.guid).done(function (res) {
                if (res.success) {
                    getFuncData(dataTabs);
                    return bootbox.alert(res.msg);
                }
                bootbox.alert(res.msg);
            }).error(function (e) {
                bootbox.alert("删除数据失败,请刷新后重试!");
            });
        }
    });
}
